package service;

import domain.dto.*;
import domain.entity.*;
import domain.vo.*;

import java.util.Arrays;

public class RoleService {
    /**
     * 实体对象存储量
     */
    public static int DATA_SIZE = 100;
    /**
     * 实体对象存储数组
     */
    public static Role[] data = new Role[DATA_SIZE + 1];
    /**
     * ID 计数器
     */
    public static int idCounter = 1;

    public static Role createEntity(RoleDto dto, int id) {
        Role role = new Role(dto.name, dto.dataScope);
        role.id = id;
        return role;
    }

    public static void updateEntity(RoleDto dto, Role role) {
        role.name = dto.name;
        role.dataScope = dto.dataScope;
    }

    public static Result create(RoleDto dto) {
        if (idCounter > DATA_SIZE) {
            return Result.failure("创建失败，超出存储容量");
        }
        Role role = createEntity(dto, idCounter++);

        data[role.id] = role;
        // 返回成功结果
        return Result.success("创建成功", null);
    }
    public static RoleVo convertToVo(Role role) {

        return new RoleVo(role.id, role.name, role.dataScope);
    }


    public static Result list() {
        // 创建⼀个临时数组
        RoleVo[] temp = new RoleVo[DATA_SIZE];
        // ⽤于记录临时数组的实际存储⻓度
        int length = 0;

        for (int i = 1; i < idCounter; i++) {

            if (data[i] != null) {
                temp[length++] = convertToVo(data[i]);
            }
        }
        // 返回查询成功的结果，并返回临时数组的有效部分
        return Result.success("查询成功", Arrays.copyOf(temp, length));
    }

    public static boolean existsById(int id) {
        return id >= 1 && id < idCounter && data[id] != null;
    }

    public static Result update(RoleDto dto, int id) {
        // 检查提供的部⻔ ID 是否有效：ID ⼩于 1，ID 超出有效范围，或者该 ID 对应的数据为空
        if (!existsById(id)) {
            return Result.failure("更新失败，不存在该数据");
        }
        if (id < 1 || id >= idCounter || data[id] == null) {
            // 如果 ID ⽆效，返回更新失败的结果
            return Result.failure("更新失败，不存在该数据");
        }

        Role role = data[id];
        updateEntity(dto, role);
        // 返回更新成功的结果
        return Result.success("更新成功", null);
    }

    public static Result delete(int id) {
        if (!existsById(id)) {
            return Result.failure("删除失败，不存在该数据");
        }
        if (id < 1 || id >= idCounter || data[id] == null) {
            // 如果 ID ⽆效，返回删除失败的结果
            return Result.failure("删除失败，不存在该数据");
        }
        if (UserService.roleInUse(id)) {
            return Result.failure("删除失败，有⽤户具有该⻆⾊，不能删除");
        }
        // 将指定 ID 的部⻔数据置为 null，表示删除该数据
        data[id] = null;
        // 返回删除成功的结果
        return Result.success("删除成功", null);
    }

    public static Role findById(int id) {
        // 调⽤ existsById ⽅法检查该 ID 对应的部⻔是否存在
        if (existsById(id)) {
            // 如果存在，返回该 ID 对应的部⻔实体对象
            return data[id];
        }
        // 如果不存在，返回 null
        return null;
    }
}
